home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 06 - 1990 / 06.09 Sep 90 / LSObjectShell / MyDialogs.p < prev    next >
Encoding:
Text File  |  1989-10-15  |  6.1 KB  |  265 lines  |  [TEXT/PJMM]

  1. UNIT MyDialogs;
  2. {***********************************}
  3. INTERFACE
  4.  
  5.     USES
  6.         MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, MacPrint, ObjIntf, GlobalStuff;
  7.  
  8.     TYPE
  9.         TDialog = OBJECT(TObject)
  10.                 fDlogItems: Integer;
  11.                 fDFlag: BOOLEAN;
  12.                 fPopMenus: Integer;
  13.                 fPopUpID: Integer;
  14.                 fPopItem: Integer;
  15.                 fStr: ARRAY[1..kMaxEditItems] OF Str255;
  16.                 PROCEDURE Init (vDlogItems, vPopMenus, vPopUpID: Integer;
  17.                                             vDFlag: BOOLEAN);
  18.                 PROCEDURE DoDialog (vDialogID: Integer);
  19.             END;
  20.  
  21. {***********************************}
  22. IMPLEMENTATION
  23.  
  24.     CONST
  25.         cPromptItem = 3;
  26.         cPopUpItem = 4;
  27.         cFirstEditItem = 5;
  28.  
  29.     VAR
  30.         uItemType: Integer;
  31.         uItemHdl: Handle;
  32.         uItemRect: Rect;
  33.         uPopUpRect: Rect;
  34.         uPromptRect: Rect;
  35.         uPopUpID: Integer;
  36.         uPopMenuHdl: MenuHandle;
  37.         uMarkedItem: Integer;
  38.  
  39. {========================================}
  40.     PROCEDURE TDialog.Init (vDlogItems, vPopMenus, vPopUpID: Integer;
  41.                                     vDFlag: BOOLEAN);
  42.     BEGIN
  43.         fDlogItems := vDlogItems;
  44.         fPopMenus := vPopMenus;
  45.         fPopUpID := vPopUpID;
  46.         fPopItem := 1;
  47.         fDFlag := vDFlag;
  48.     END;    {Init}
  49.  
  50. {========================================}
  51.     PROCEDURE OutlineOK (vDPtr: DialogPtr);
  52.         VAR
  53.             vSavePort: GrafPtr;
  54.  
  55.     BEGIN
  56.         GetPort(vSavePort);
  57.         SetPort(vDPtr);
  58.         GetDItem(vDPtr, OK, uItemType, uItemHdl, uItemRect);
  59.         IF uItemHdl <> NIL THEN
  60.             BEGIN
  61.                 PenSize(3, 3);
  62.                 InsetRect(uItemRect, -4, -4);
  63.                 FrameRoundRect(uItemRect, 16, 16);
  64.                 PenSize(1, 1);
  65.             END;
  66.         SetPort(vSavePort);
  67.     END; {OutlineOK}
  68.  
  69. {-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -}
  70.     PROCEDURE DrawPopUp (vDPtr: DialogPtr;
  71.                                     vItem: Integer);
  72.         CONST
  73.             cLeftSlop = 5;
  74.             cRightSlop = 3;
  75.             cBotSlop = 7;
  76.  
  77.         VAR
  78.             vRect: Rect;
  79.             vItemText: Str255;
  80.             vWidth, vNewWidth, vNewLength: Integer;
  81.  
  82.     BEGIN
  83.         GetItem(uPopMenuHdl, uMarkedItem, vItemText);
  84.         vRect := uPopUpRect;
  85.         WITH vRect DO
  86.             BEGIN
  87.                 InsetRect(vRect, -1, -1);
  88.                 vWidth := (right - left) - (cLeftSlop + cRightSlop);
  89.                 vNewWidth := StringWidth(vItemText);
  90.                 IF vNewWidth > vWidth THEN
  91.                     BEGIN
  92.                         vNewLength := LENGTH(vItemText);
  93.                         vWidth := vWidth - CharWidth('…');
  94.  
  95.                         REPEAT
  96.                             vNewWidth := vNewWidth - CharWidth(vItemText[vNewLength]);
  97.                             Delete(vItemText, vNewLength, 1);
  98.                             vNewLength := PRED(vNewLength);
  99.                         UNTIL (vNewWidth <= vWidth) OR (LENGTH(vItemText) = 0);
  100.  
  101.                         vNewLength := SUCC(vNewLength);
  102.                         Insert('…', vItemText, vNewLength);
  103.                     END;
  104.  
  105.                 FrameRect(vRect);
  106.                 MoveTo(right, top + 2);
  107.                 LineTo(right, bottom);
  108.                 LineTo(left + 2, bottom);
  109.  
  110.                 MoveTo(left + cLeftSlop, bottom - cBotSlop);
  111.                 DrawString(vItemText);
  112.             END;
  113.     END; {DrawPopUp}
  114.  
  115. {-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -}
  116.     FUNCTION MyFilter (vDPtr: DialogPtr;
  117.                                     VAR vEvent: EventRecord;
  118.                                     VAR vItemHit: Integer): BOOLEAN;
  119.         VAR
  120.             vSavePort: GrafPtr;
  121.             vMousePt, vPopLoc: Point;
  122.             vNewItem: Integer;
  123.             vResult: LongInt;
  124.  
  125.     BEGIN
  126.         vItemHit := 0;
  127.         MyFilter := FALSE;
  128.         GetPort(vSavePort);
  129.         SetPort(vDPtr);
  130.  
  131.         CASE vEvent.what OF
  132.             keyDown: 
  133.                 BEGIN
  134.                     IF (vEvent.message MOD 256) IN [kCR, kEnter] THEN
  135.                         BEGIN
  136.                             GetDItem(vDPtr, OK, uItemType, uItemHdl, uItemRect);
  137.                             HiliteControl(ControlHandle(uItemHdl), 1);
  138.                             Delay(3, vResult);
  139.  
  140.                             MyFilter := TRUE;
  141.                             vItemHit := OK;
  142.                         END;
  143.                 END;
  144.  
  145.             mouseDown: 
  146.                 BEGIN
  147.                     vMousePt := vEvent.where;
  148.                     GlobalToLocal(vMousePt);
  149.  
  150.                     IF (FindDItem(vDPtr, vMousePt) + 1) = cPopUpItem THEN
  151.                         BEGIN
  152.                             InvertRect(uPromptRect);
  153.                             InsertMenu(uPopMenuHdl, -1);
  154.                             vPopLoc := uPopUpRect.topLeft;
  155.                             LocalToGlobal(vPopLoc);
  156.                             CalcMenuSize(uPopMenuHdl);
  157.                             WITH vPopLoc DO
  158.                                 vResult := PopUpMenuSelect(uPopMenuHdl, v, h, uMarkedItem);
  159.                             InvertRect(uPromptRect);
  160.                             DeleteMenu(uPopUpID);
  161.                             IF vResult <> 0 THEN
  162.                                 BEGIN
  163.                                     vNewItem := LoWord(vResult);
  164.  
  165.                                     IF vNewItem <> uMarkedItem THEN
  166.                                         BEGIN
  167.                                             SetItemMark(uPopMenuHdl, uMarkedItem, ' ');
  168.                                             SetItemMark(uPopMenuHdl, vNewItem, CHR(checkMark));
  169.                                             uMarkedItem := vNewItem;
  170.                                             EraseRect(uPopUpRect);
  171.                                             DrawPopUp(vDPtr, cPopUpItem);
  172.  
  173.                                             MyFilter := TRUE;
  174.                                             vItemHit := cPopUpItem;
  175.                                         END;
  176.                                 END;
  177.                         END;
  178.                 END;
  179.             OTHERWISE
  180.         END;
  181.         SetPort(vSavePort);
  182.     END; {MyFilter}
  183.  
  184. {-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -}
  185.     PROCEDURE TDialog.DoDialog (vDialogID: Integer);
  186.         VAR
  187.             vDPtr: DialogPtr;
  188.             vItem, vItemNum: Integer;
  189.             vStr: Str255;
  190.  
  191.     BEGIN
  192.         CenterMyDialog('DLOG', vDialogID);
  193.         vDPtr := GetNewDialog(vDialogID, NIL, POINTER(-1));
  194.         IF vDPtr = NIL THEN
  195.             Exit(DoDialog);
  196.  
  197.         IF fDFlag THEN
  198.             FOR vItem := 1 TO fDlogItems DO
  199.                 BEGIN
  200.                     vItemNum := vItem + cFirstEditItem - 1;
  201.                     GetDItem(vDPtr, vItemNum, uItemType, uItemHdl, uItemRect);
  202.                     SetIText(uItemHdl, fStr[vItem]);
  203.                 END;
  204.  
  205.         OutlineOK(vDPtr);
  206.         GetDItem(vDPtr, cFirstEditItem, uItemType, uItemHdl, uItemRect);
  207.         SelIText(vDPtr, cFirstEditItem, 0, maxInt);
  208.  
  209.         CASE fPopMenus OF
  210.             0: 
  211.                 REPEAT
  212.                     ModalDialog(NIL, vItemNum)
  213.                 UNTIL (vItemNum IN [OK, Cancel]);
  214.             1: 
  215.                 BEGIN
  216.                     uPopUpID := fPopUpID;
  217.                     uPopMenuHdl := GetMenu(fPopUpID);
  218.                     SetItemMark(uPopMenuHdl, fPopItem, CHR(checkMark));
  219.                     uMarkedItem := fPopItem;
  220.  
  221.                     GetDItem(vDPtr, cPopUpItem, uItemType, uItemHdl, uPopUpRect);
  222.                     SetDItem(vDPtr, cPopUpItem, uItemType, @DrawPopUp, uPopUpRect);
  223.                     GetDItem(vDPtr, cPromptItem, uItemType, uItemHdl, uPromptRect);
  224.  
  225.                     REPEAT
  226.                         ModalDialog(@MyFilter, vItemNum);
  227.                         CASE vItemNum OF
  228.                             cPopUpItem: 
  229.                                 BEGIN
  230.                                     fPopItem := uMarkedItem;
  231.                                 END;
  232.                             OTHERWISE
  233.                         END;
  234.                     UNTIL (vItemNum IN [OK, Cancel]);
  235.  
  236.                     ReleaseResource(Handle(uPopMenuHdl));
  237.                 END;
  238.             OTHERWISE
  239.         END;
  240.  
  241.         CASE vItemNum OF
  242.             OK: 
  243.                 BEGIN
  244.                     FOR vItem := 1 TO fDlogItems DO
  245.                         BEGIN
  246.                             vItemNum := vItem + cFirstEditItem - 1;
  247.                             GetDItem(vDPtr, vItemNum, uItemType, uItemHdl, uItemRect);
  248.                             GetIText(uItemHdl, vStr);
  249.                             fStr[vItem] := vStr;
  250.                         END;
  251.                     fDFlag := TRUE;
  252.                 END;
  253.             Cancel: 
  254.                 BEGIN
  255.                     fPopItem := 1;
  256.                     fDFlag := FALSE;
  257.                 END;
  258.             OTHERWISE
  259.         END;
  260.  
  261.         DisposDialog(vDPtr);
  262.     END; {DoDialog}
  263.  
  264. END. {unit MyDialogs}
  265. {***********************************}